
    <!DOCTYPE html>
    <html lang="zh-CN">
    <head>
      <meta charset="UTF-8">
      <meta name="viewport" content="width=device-width, initial-scale=1.0">
      <title>线程中的 start() 和 run() 有那些区别？ - 学习卡片</title>
      <style>
        body { font-family: sans-serif; background-color: #f0f8ff; color: #333; display: flex; flex-direction: column; align-items: center; padding: 50px 20px; }
        .header h1 { font-size: 32px; }
        .grid-container { display: grid; grid-template-columns: repeat(3, 1fr); gap: 28px; width: 100%; max-width: 1200px; }
        .card-container { perspective: 1200px; cursor: pointer; height: 250px; }
        .card { width: 100%; height: 100%; position: relative; transform-style: preserve-3d; transition: transform 0.7s; border-radius: 16px; box-shadow: 0 4px 16px rgba(0,0,0,0.08); }
        .card-container.flipped .card { transform: rotateY(180deg); }
        .card-face { position: absolute; width: 100%; height: 100%; backface-visibility: hidden; display: flex; flex-direction: column; box-sizing: border-box; border-radius: 16px; background-color: #fff; padding: 24px; }
        .card-back { background-color: #f0fff4; transform: rotateY(180deg); justify-content: space-between; }
        .card-category { font-size: 14px; color: #0052d9; margin-bottom: 8px; font-weight: 500; }
        .card-question { font-size: 20px; font-weight: 500; flex-grow: 1; display: flex; align-items: center; justify-content: center; text-align: center; }
        .card-answer-wrapper { flex-grow: 1; overflow-y: auto; }
        .card-answer { font-size: 15px; line-height: 1.7; }
        .card-footer { font-size: 13px; color: #8a919f; border-top: 1px solid #f0f0f0; padding-top: 16px; margin-top: 16px; }
        .card-source { font-size: 13px; color: #8a919f; border-top: 1px solid #f0f0f0; padding-top: 12px; margin-top: 12px; }
      </style>
    </head>
    <body>
      <div class="header">
        <h1>线程中的 start() 和 run() 有那些区别？ - 学习卡片</h1>
      </div>
      <div class="grid-container">
        
    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">机制</div>
          <div class="card-question">在Java的Thread类中，`start()`方法的核心作用是什么？它如何启动一个新线程？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">机制</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">`start()`方法的主要功能是启动一个新线程。调用后，JVM会为该线程创建一个新的线程栈，并将其置于可运行状态。然后，线程调度器会在合适的时间调用该线程的`run()`方法，从而实现并发运行。</div>
          </div>
          <div class="card-source">来源: 文档中「1. start() 方法」部分</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">机制</div>
          <div class="card-question">如果直接调用Java线程的`run()`方法，而不是通过`start()`方法，会产生什么效果？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">机制</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">如果直接调用`run()`方法，它不会启动一个新线程。相反，`run()`方法中的代码将在调用线程的上下文中同步执行，就像一个普通的成员方法调用一样，无法实现多线程并发。</div>
          </div>
          <div class="card-source">来源: 文档中「2. run() 方法」部分</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">特性</div>
          <div class="card-question">为什么对同一个线程对象多次调用`start()`方法会引发异常？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">特性</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">因为`start()`方法只能被调用一次。多次调用会抛出`IllegalThreadStateException`异常。这是因为一个线程一旦启动，其状态就会改变，不能被重新启动。</div>
          </div>
          <div class="card-source">来源: 文档中「1. start() 方法」部分的「关键点」</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">对比</div>
          <div class="card-question">请总结`start()`和`run()`方法在调用次数和线程并发性上的主要区别。</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">对比</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">1. 调用次数：`start()`方法只能调用一次，否则会抛出异常；`run()`方法可以像普通方法一样被多次调用。<br>2. 线程并发性：`start()`方法能启动新线程并与调用线程并发运行；`run()`方法只是在当前线程中顺序执行，不具备并发性。</div>
          </div>
          <div class="card-source">来源: 文档中「3. start() 和 run() 的区别总结」表格</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">模式</div>
          <div class="card-question">根据文档的建议，在需要并发执行任务时，应该选择`start()`还是`run()`方法？为什么？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">模式</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">应该使用`start()`方法。因为它能确保任务在一个新的线程中并发执行，从而不会阻塞主线程或调用线程。直接调用`run()`方法无法达到并发的目的，是一种错误用法。</div>
          </div>
          <div class="card-source">来源: 文档中「4. 实践中的建议」部分</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">技术</div>
          <div class="card-question">调用`thread.run()`时，`Thread.currentThread().getName()`会返回什么？与调用`thread.start()`时有何不同？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">技术</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">当直接调用`thread.run()`时，`Thread.currentThread().getName()`会返回调用线程的名称（例如主线程'main'），因为代码在当前线程中执行。而调用`thread.start()`后，`run()`方法内部的`Thread.currentThread().getName()`会返回新创建的线程的名称（例如'Thread-0'），因为代码在一个新的执行上下文中运行。</div>
          </div>
          <div class="card-source">来源: 文档中「5. 示例对比」部分</div>
        </div>
      </div>
    </div>

      </div>
    </body>
    </html>
